#include "Tijera.h"
#include "../fisica/TijeraFisica.h"
#include <iostream>
using namespace std;

Tijera::Tijera(double x, double y, double ancho, double alto, string pathImagen) :
		Elemento(x, y, ancho, alto, pathImagen) {
	// Creacion de la tijera

	this->frameActual = 1;
	this->cantFrames = 2;

	this->posSogaIzqX = 0;
	this->posSogaIzqY = 0;
	this->sogaDerUnida = NULL;
	this->sogaIzqUnida = NULL;
//	this->posSogaDerX = ancho;
	this->posSogaDerX = 0;
	this->posSogaDerY = 0;
	this->sogaIzqInicial = false;
	this->sogaDerInicial = false;
	this->estaAbierta = true;
//	this->setAnguloRotacion(270);
	this->elementoFilo1 = NULL;
	this->elementoFilo2 = NULL;
}

Tijera::~Tijera() {
}

void Tijera::rotar(double angulo) {

}

bool Tijera::aceptaSoga() {
	if (this->sogaIzqUnida && this->sogaDerUnida)
		return false;
	return true;
}

void Tijera::dibujar(double x, double y, double ancho, double alto,
		SDL_Renderer* renderer) {
	Elemento::dibujar(x, y, ancho, alto, renderer);
}

//bool Tijera::esAnimable(){
//	if ( this->x != this->xAnterior ){
//		return true;
//	} else {
//		return false;
//	}
//}

pair<double, double> Tijera::getCentroCorte() {

//	cout << "Tijera X: " << this->getX() <<
//				" Y: "<< this->getY() << endl;

//	cout << "El punto de corte de la tiijera es X: " <<
//			this->getX() + this->getAncho() * PROPORCION_TIJERA_CORTE_X <<
//			" Y: "<< this->getY() + this->getAlto() * PROPORCION_TIJERA_CORTE_Y << endl;

	double puntoCorteX =
			this->getX() + this->getAncho() * PROPORCION_TIJERA_CORTE_X;
	double puntoCorteY =
			this->getY() + this->getAlto() * PROPORCION_TIJERA_CORTE_Y;

	pair<double, double> centroCorte;
	centroCorte.first = puntoCorteX;
	centroCorte.second = puntoCorteY;

	return centroCorte;
}

void Tijera::actualizarValoresFisicos() {

//	Elemento::actualizarValoresFisicos();

	// Sobreescribo el actualizarValoresFisicos
	this->setX(this->getEntidadFisica()->obtenerPosicionX() - this->getAncho()/2);
	this->setY(100 - this->getEntidadFisica()->obtenerPosicionY() - this->getAlto()/2);
	this->actualizarReferencias();
	this->actualizarImagen();


	TijeraFisica* tijeraFisica = (TijeraFisica*) this->getEntidadFisica();
	if (tijeraFisica->tijeraEstaCerrada()) {
		//cout << "Se cerro la tijera" << endl;
		this->setPathImagen("img/tijera_cerrada.png");
		this->eliminarImagenElemento();
	} else {
	//	cout << "Se abrio la tijera" << endl;
		this->setPathImagen("img/tijera_abierta.png");
		this->eliminarImagenElemento();
	}
}

void Tijera::activarSogaPosInicial() {
	this->sogaIzqInicial = true;
}

void Tijera::activarSogaPosFinal() {
	this->sogaDerInicial = true;
}

void Tijera::mover(double centroX, double centroY) {
	Elemento::mover(centroX, centroY);
	this->actualizarReferencias();
}

void Tijera::referenciarElementos() {

	if (this->sogaIzqUnida != NULL) {
		pair<Elemento*, Elemento*> parElementos =
				this->sogaIzqUnida->obtenerExtremos();
	/*	cout << "Elemento 1 izq: " << parElementos.first->getTipo() << endl;
		cout << "Elemento 2 izq: " << parElementos.second->getTipo() << endl;*/
		if (parElementos.first == this) {
			this->elementoFilo1 = parElementos.second;
		} else {
			this->elementoFilo1 = parElementos.first;
		}
	}

	if (this->sogaDerUnida != NULL) {
		pair<Elemento*, Elemento*> parElementos =
				this->sogaDerUnida->obtenerExtremos();
		/*cout << "Elemento 1 der: " << parElementos.first->getTipo() << endl;
		cout << "Elemento 2 der: " << parElementos.second->getTipo() << endl;*/
		if (parElementos.first == this) {
			this->elementoFilo2 = parElementos.second;
		} else {
			this->elementoFilo2 = parElementos.first;
		}
	}
}

void Tijera::actualizarReferencias() {

//	if (this->sogaIzqUnida != NULL) {
//
//		cout << "Actualizo soga Izq" << endl;
//
//		pair<double,double> parXYAObtener = this->obtenerPosicionSoga(0);
//
//		if (this->sogaIzqInicial) {
//
//			cout << "SOGA IZQ INICIAL" << endl;
//			this->sogaIzqUnida->setPosicionInicial(
//					parXYAObtener.first,
//					parXYAObtener.second);
//		} else {
//			cout << "NOO SOGA IZQ INICIAL" << endl;
//			this->sogaIzqUnida->setPosicionFinal(
//					parXYAObtener.first,
//					parXYAObtener.second);
//		}
//	}
//	if (this->sogaDerUnida != NULL) {
//
//		cout << "Actualizo soga Der" << endl;
//
//		pair<double,double> parXYAObtener = this->obtenerPosicionSoga(1);
//
//		if (this->sogaDerInicial) {
//			cout << "SOGA DER INICIAL" << endl;
//
//			this->sogaDerUnida->setPosicionInicial(
//					parXYAObtener.first,
//					parXYAObtener.second);
//		} else {
//			cout << "SOGA NOOO DER INICIAL" << endl;
//
//			this->sogaDerUnida->setPosicionFinal(
//					parXYAObtener.first,
//					parXYAObtener.second);
//		}
//	}

	if (this->sogaIzqUnida != NULL) {

		//cout << "Actualizo soga Arriba" << endl;

		if (this->sogaIzqInicial) {
			this->sogaIzqUnida->setPosicionInicial(
					this->getX() + this->posSogaIzqX,
					this->getY()
							+ this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ARRIBA
							+ this->posSogaIzqY);
		} else {
			this->sogaIzqUnida->setPosicionFinal(
					this->getX() + this->posSogaIzqX,
					this->getY()
							+ this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ARRIBA
							+ this->posSogaIzqY);
		}
	}
	if (this->sogaDerUnida != NULL) {

		//cout << "Actualizo soga Abajo" << endl;

		if (this->sogaDerInicial) {
			this->sogaDerUnida->setPosicionInicial(
					this->getX() + this->posSogaDerX,
					this->getY()
							+ this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ABAJO
							+ this->posSogaDerY);
		} else {
			this->sogaDerUnida->setPosicionFinal(
					this->getX() + this->posSogaDerX,
					this->getY()
							+ this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ABAJO
							+ this->posSogaDerY);
		}
	}
}

void Tijera::agregarSogaInicial(Elemento* soga) {

	cout << "Entro a agregar soga inicial " << endl;
//	if (this->sogaIzqUnida) {
//		cout << "Habia simulado anteriormente izq " << endl;
//		if (this->sogaIzqUnida->getIdElemento() == soga->getIdElemento()) {
//			pair<double,double> parXYAObtener = this->obtenerPosicionSoga(0);
//			soga->setPosicionInicial(parXYAObtener.first,parXYAObtener.second);
//			return;
//		}
//	}
//
//	if (this->sogaDerUnida) {
//		cout << "Habia simulado anteriormente der" << endl;
//		if (this->sogaDerUnida->getIdElemento() == soga->getIdElemento()) {
//			pair<double,double> parXYAObtener = this->obtenerPosicionSoga(1);
//			soga->setPosicionInicial(parXYAObtener.first,parXYAObtener.second);
//			return;
//		}
//	}
//
//	// No habia simulado previamente
//	pair<double, double> posicionInicioSoga = soga->getPosicionInicial();
//	double medioTijera = this->getX() + this->getAlto() / 2;
//	cout << "medio Tijera: " << medioTijera << "y posicion inicio soga x:  "
//			<< posicionInicioSoga.first << endl;
//
//	if (posicionInicioSoga.first <= medioTijera) {
//		pair<double,double> parXYAObtener = this->obtenerPosicionSoga(0);
//		soga->setPosicionInicial(parXYAObtener.first,parXYAObtener.second);
//		this->sogaIzqUnida = soga;
//		this->sogaIzqInicial = true;
//	} else {
//		pair<double,double> parXYAObtener = this->obtenerPosicionSoga(1);
//		soga->setPosicionInicial(parXYAObtener.first,parXYAObtener.second);
//		this->sogaDerUnida = soga;
//		this->sogaDerInicial = true;
//	}

	if (this->sogaIzqUnida) {
		cout << "Habia simulado anteriormente arriba " << endl;
		if (this->sogaIzqUnida->getIdElemento() == soga->getIdElemento()) {
			soga->setPosicionInicial(this->getX() + this->posSogaIzqX,
					this->getY()
							+ this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ARRIBA
							+ this->posSogaIzqY);
			return;
		}
	}

	if (this->sogaDerUnida) {
		cout << "Habia simulado anteriormente abajo" << endl;
		if (this->sogaDerUnida->getIdElemento() == soga->getIdElemento()) {
			soga->setPosicionInicial(this->getX() + this->posSogaDerX,
					this->getY()
							+ this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ABAJO
							+ this->posSogaDerY);
			return;
		}
	}

	// No habia simulado previamente
	pair<double, double> posicionInicioSoga = soga->getPosicionInicial();
	double medioTijera = this->getY() + this->getAlto() / 2;
	cout << "medio Tijera: " << medioTijera << "y posicion inicio soga y:  "
			<< posicionInicioSoga.second << endl;

	if (posicionInicioSoga.second <= medioTijera) {
		soga->setPosicionInicial(this->getX() + this->posSogaIzqX,
				this->getY() + this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ARRIBA
						+ this->posSogaIzqY);
		this->sogaIzqUnida = soga;
		this->sogaIzqInicial = true;
	} else {
		soga->setPosicionInicial(this->getX() + this->posSogaDerX,
				this->getY() + this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ABAJO
						+ this->posSogaDerY);
		this->sogaDerUnida = soga;
		this->sogaDerInicial = true;
	}

}

void Tijera::agregarSogaFinal(Elemento* soga) {

//	if (this->sogaIzqUnida) {
//		if (this->sogaIzqUnida->getIdElemento() == soga->getIdElemento()) {
//			pair<double,double> parXYAObtener = this->obtenerPosicionSoga(0);
//			soga->setPosicionFinal(parXYAObtener.first,parXYAObtener.second);
//			this->sogaIzqUnida = soga;
//			this->sogaIzqInicial = false;
//			return;
//		}
//	}
//
//	if (this->sogaDerUnida) {
//		if (this->sogaDerUnida->getIdElemento() == soga->getIdElemento()) {
//			pair<double,double> parXYAObtener = this->obtenerPosicionSoga(1);
//			soga->setPosicionFinal(parXYAObtener.first,parXYAObtener.second);
//			this->sogaDerUnida = soga;
//			this->sogaDerInicial = false;
//			return;
//		}
//	}
//
//	cout << "agregar soga final balancin " << endl;
//	pair<double, double> posicionFinSoga = soga->getPosicionFinal();
//	double medioTijera = this->getX() + this->getAlto() / 2;
//	cout << "medio Tijera: " << medioTijera << "y posicion inicio soga x:  "
//			<< posicionFinSoga.first << endl;
//
//	if (posicionFinSoga.first <= medioTijera) {
//		pair<double,double> parXYAObtener = this->obtenerPosicionSoga(0);
//		soga->setPosicionFinal(parXYAObtener.first,parXYAObtener.second);
//		this->sogaIzqUnida = soga;
//		this->sogaIzqInicial = false;
//	} else {
//		pair<double,double> parXYAObtener = this->obtenerPosicionSoga(1);
//		soga->setPosicionFinal(parXYAObtener.first,parXYAObtener.second);
//		this->sogaDerUnida = soga;
//		this->sogaDerInicial = false;
//	}

	if (this->sogaIzqUnida) {
		cout << "Habia simulado anteriormente arriba " << endl;
		if (this->sogaIzqUnida->getIdElemento() == soga->getIdElemento()) {
			soga->setPosicionFinal(this->getX() + this->posSogaIzqX,
					this->getY()
							+ this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ARRIBA
							+ this->posSogaIzqY);
			this->sogaIzqUnida = soga;
			this->sogaIzqInicial = false;
			return;
		}
	}

	if (this->sogaDerUnida) {
		cout << "Habia simulado anteriormente abajo" << endl;
		if (this->sogaDerUnida->getIdElemento() == soga->getIdElemento()) {
			soga->setPosicionFinal(this->getX() + this->posSogaDerX,
					this->getY()
							+ this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ABAJO
							+ this->posSogaDerY);
			this->sogaDerUnida = soga;
			this->sogaDerInicial = false;
			return;
		}
	}

	// No habia simulado previamente
	pair<double, double> posicionInicioSoga = soga->getPosicionInicial();
	double medioTijera = this->getY() + this->getAlto() / 2;
	cout << "medio Tijera: " << medioTijera << "y posicion inicio soga y:  "
			<< posicionInicioSoga.second << endl;

	if (posicionInicioSoga.second <= medioTijera) {
		soga->setPosicionFinal(this->getX() + this->posSogaIzqX,
				this->getY() + this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ARRIBA
						+ this->posSogaIzqY);
		this->sogaIzqUnida = soga;
		this->sogaIzqInicial = false;
	} else {
		soga->setPosicionFinal(this->getX() + this->posSogaDerX,
				this->getY() + this->getAlto() * PROPORCION_SOGA_TIJERA_Y_ABAJO
						+ this->posSogaDerY);
		this->sogaDerUnida = soga;
		this->sogaDerInicial = false;
	}

}

void Tijera::eliminarSoga(Elemento* soga) {
//	cout << "soga a eliminar  en " << this->getTipo()  << " con id: " << soga->getIdElemento() << endl;
	if (this->sogaIzqUnida) {
	/*	cout << "soga izq con id: " << this->sogaIzqUnida->getIdElemento()
				<< endl;*/

		if (this->sogaIzqUnida->getIdElemento() == soga->getIdElemento()) {
			cout << "Elimino soga izquierda" << endl;
			this->sogaIzqUnida = NULL;
			this->sogaIzqInicial = false;
			cout << "Elimine soga izquierda unida" << endl;
			return;
		}
	}

	if (this->sogaDerUnida) {
		cout << "soga der con id: " << this->sogaDerUnida->getIdElemento()
				<< endl;

		if (this->sogaDerUnida->getIdElemento() == soga->getIdElemento()) {
			cout << "Elimino soga derecha" << endl;
			this->sogaDerUnida = NULL;
			this->sogaDerInicial = false;
			return;
		}
	}
}

int Tijera::seSuperpone(Elemento* elemento) {
	if (elemento->getTipo() == "soga")
		return 0;
	return 2;
}

void Tijera::eliminarReferencias(list<Elemento*>* elementosCanvas) {

	pair<Elemento*, Elemento*> extremosSoga;
	pair<Elemento*, Elemento*> extremosSogaIzq, extremosSogaDer;

	if (this->sogaIzqUnida) {

		this->sogaIzqUnida->eliminarReferencias(elementosCanvas);
		delete this->sogaIzqUnida;
	}
	if (this->sogaDerUnida) {
		this->sogaDerUnida->eliminarReferencias(elementosCanvas);
		delete this->sogaDerUnida;
	}
}

int Tijera::haySogaIzqUnida() {
	if (this->sogaIzqUnida)
		return 1;
	return 0;
}

int Tijera::haySogaDerUnida() {
	if (this->sogaDerUnida)
		return 1;
	return 0;
}

bool Tijera::esBasico() {
	return false;
}

bool Tijera::sogaEnPosInicial() {
	return this->sogaIzqInicial;
}

bool Tijera::sogaEnPosFinal() {
	return this->sogaDerInicial;

}

pair<Elemento*, Elemento*> Tijera::obtenerExtremos() {
	pair<Elemento*, Elemento*> extremos;
	extremos.first = NULL;
	extremos.second = NULL;
	cout << "estoy en Tijera con haySogaIzq: " << this->haySogaIzqUnida()
			<< " y hay soga derecha: " << this->haySogaDerUnida() << endl;

	if (this->sogaIzqUnida) {
		cout << "TIENE SOGA IZQ " << endl;
		extremos.first = this->sogaIzqUnida;
	}
	if (this->sogaDerUnida) {
		cout << "TIENE SOGA DER " << endl;
		extremos.second = this->sogaDerUnida;
	}
	return extremos;
}

void Tijera::setSogaInicial(Elemento* elem) {
	this->sogaIzqUnida = elem;
}

void Tijera::setSogaFinal(Elemento* elem) {
	this->sogaDerUnida = elem;

}

void Tijera::jointearElemento(b2World* world) {

	this->referenciarElementos();
	EntidadFisica* elementoFilo1 = NULL;
	EntidadFisica* elementoFilo2 = NULL;

	if (this->elementoFilo1 || this->elementoFilo2) {
		cout << "creo tijera" << endl;

		if (this->elementoFilo1) {
			elementoFilo1 = this->elementoFilo1->getEntidadFisica();
		}

		if (this->elementoFilo2) {
			elementoFilo2 = this->elementoFilo2->getEntidadFisica();
		}

		TijeraFisica* tijeraFisica = (TijeraFisica*) this->getEntidadFisica();
		tijeraFisica->setearElementosAJointear(elementoFilo1, elementoFilo2);
		tijeraFisica->jointear(world);
		cout << "Finalizo joint" << endl;
	} else {
		cout << "La polea no tiene dos elementos jointeados" << endl;
	}
}

//pair<double,double> Tijera::obtenerPosicionSoga(int sentido){
//
//	pair<double,double> posicionXYAObtener;
//
//	// Soga izquierda
//	if (sentido == 0){
//
//		double angulo = this->getAnguloRotacion() - 360;
//
//		double xTrasladado = -this->getAncho()/2 + this->getAncho() * PROPORCION_SOGA_TIJERA_X_IZQ;
//		double yTrasladado = this->getAlto()/2;
//
//		double xRotado = xTrasladado * cos(angulo * PI / 180.0) +
//				yTrasladado	* sin(angulo * PI/ 180.0);
//		double yRotado = -xTrasladado * sin(angulo * PI / 180.0)	+
//				yTrasladado	* cos(angulo * PI/ 180.0);
//
//		double xAObtener = this->getX() + this->getAncho()/2 + xRotado;
//		double yAObtener = this->getY() + this->getAlto()/2  - yRotado;
//
//		posicionXYAObtener.first = xAObtener;
//		posicionXYAObtener.second = yAObtener;
//	}
//	// Soga derecha
//	else if (sentido == 1){
//		double angulo = 360 - this->getAnguloRotacion();
//
//		double xTrasladado = -this->getAncho()/2 + this->getAncho() * PROPORCION_SOGA_TIJERA_X_DER;
//		double yTrasladado = this->getAlto()/2;
//
//		double xRotado = xTrasladado * cos(angulo * PI / 180.0) -
//				yTrasladado	* sin(angulo * PI/ 180.0);
//		double yRotado = xTrasladado * sin(angulo * PI / 180.0)	+
//				yTrasladado	* cos(angulo * PI/ 180.0);
//
//		double xAObtener = this->getX() + this->getAncho()/2 + xRotado;
//		double yAObtener = this->getY() + this->getAlto()/2  - yRotado;
//
//		posicionXYAObtener.first = xAObtener;
//		posicionXYAObtener.second = yAObtener;
//	}
//
//	return posicionXYAObtener;
//}

bool Tijera::estaCerrada() {
	if (this->getPathImagen().compare("img/tijera_cerrada.png") == 0) {
		return true;
	}
	return false;
}

void Tijera::cerrarTijera() {
	if (this->getPathImagen().compare("img/tijera_cerrada.png") != 0) {
		this->setPathImagen("img/tijera_cerrada.png");
		this->eliminarImagenElemento();
	}
}


void Tijera::abrirTijera() {
	if (this->getPathImagen().compare("img/tijera_cerrada.png") == 0) {
		this->setPathImagen("img/tijera_abierta.png");
		this->eliminarImagenElemento();
	}
}
